Ondas senoidais 1D e 2D

Onda senoidal 1D

Para uma melhor interpretação da Transformada de Fourier é importante entender intuitivamente a função senoidal. Muitos processos oscilatórios podem ser descritos por uma função periódica na forma de uma senoide: $$ f(x) = sin(\frac {2\pi}T.x + \varphi)$$

Esta é uma função contínua que cruza o eixo $x$ nos pontos $(k\pi,0)$ . Se pensarmos agora no domínio discreto, a função senoidal genérica é dada por: $$ f(x) = A.sin(\frac {2\pi}N.u.x + \varphi)$$

onde:

  • $A$ é a amplitude do sinal.
  • $N$ é o número de amostras.
  • $x$ varia de [0 a N-1].
  • $u$ é o número de ciclos na amostra.

e ainda:

  • $T= \frac Nu$ é o número de pixels no período.
  • $f= \frac uN$ é o número de ciclos por pixel.

A função que vamos usar para gerar as ondas senoidas é a cos. Ela é capaz de gerar ondas cossenoidais 1D e 2D. Devemos lembrar que se desejarmos gerar uma senoide a partir da função que gera cossenoides, basta fazermos $$cos(x)=sin(x+\frac\pi2)$$


In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np

import sys,os
ia898path = os.path.abspath('../../')
if ia898path not in sys.path:
    sys.path.append(ia898path)
import ia898.src as ia

A = 5
N = (100,1)
T = 50
T2 = 25
theta = np.pi/2
phi = np.pi/2
f = A*ia.cos(N, T, theta, 0)
f1 = A*ia.cos(N, T, theta, phi)
f2 = A*ia.cos(N, T2, theta, 0)
f3 = A*ia.cos(N, T2, theta, phi)
x = np.linspace(-np.pi,np.pi,100)


plt.figure(1, figsize=(12,2))

plt.subplot(1,4,1)
plt.title('T=50 e theta = 0')
plt.plot(x,f)

plt.subplot(1,4,2)
plt.title('T=50 e theta = 90')
plt.plot(x,f1)

plt.subplot(1,4,3)
plt.title('T = 25 e theta = 0')
plt.plot(x,f2)

plt.subplot(1,4,4)
plt.title('T = 25 e theta = 90')
plt.plot(x,f3)


Out[1]:
[<matplotlib.lines.Line2D at 0x10d737160>]

Onda senoidal 2D

Imaginem agora que ao invés de uma senoide 1D nós temos uma senoide 2D, formando uma imagem. As equações no caso 2 D são: $$ f(r,c) = cos(2\pi(\frac 1T_r.r + \frac 1T_c.c) + \varphi)$$ ou ainda $$ f(r,c) = cos(2\pi(\frac vH.r + \frac uW.c) + \varphi)$$ onde $$T_r = \frac T{sin(\theta)}$$ e $$T_c = \frac T{cos(\theta)}$$ Além disso $$u = \frac W{T_c}$$ e $$v = \frac H{T_r}$$ onde:

  • $\theta$ é a direção da onda senoidal
  • $T$ é o período da onda, em número de pixels
  • $T_r$ e $T_c$ são os períodos ou comprimentos de onda nas direções vertical e horizontal, respectivamente, em número de pixels.
  • $H$ e $W$ são o número de linhas e colunas na imagem, respectivamente.
  • $v$ e $u$ são as frequências normalizadas nas direções horizontal e vertical directions, respectivamente, em ciclos por tamanho da imagem.

Visualizando uma cossenoide 2d

Vamos considerar então uma onda cosenoidal 2D discreta de uma imagem com 256 colunas e 128 linhas, com comprimento de onda de 100 pixels a 45 graus. Neste caso, $T=100$, $H=128$ , $W=256$, $\theta = 45$ graus.


In [12]:
H = 128
W = 256
s = (H,W)
T = 100
theta = 45 * np.pi/180
f = ia.cos(s, T, theta, 0)
plt.imshow(f, cmap='gray')


Out[12]:
<matplotlib.image.AxesImage at 0x11795f828>

In [13]:
T_r = T/np.sin(theta)
T_c = T/np.cos(theta)
v = H/T_r
u = W/T_c
print('T_r:', T_r)
print('T_c:', T_c)
print('v:', v)
print('u:', u)


T_r: 141.421356237
T_c: 141.421356237
v: 0.905096679919
u: 1.81019335984